# 1. 生成器推导式，把列表推导式的中括号改成小括号
result = [x * 2 for x in range(3)]
print(result)

generator = (x * 2 for x in range(3))
print(generator)

# 通过next函数获取生成器中的下一个值，提示生成器只能往后取值不能往前取值
# value = next(generator)
# print(value)
#
# value = next(generator)
# print(value)
#
# value = next(generator)
# print(value)

# 生成器把数据生成完成后，再次通过生成器获取下一个值会抛出停止迭代异常(StopIteration)
# value = next(generator)
# print(value)

# while True:
#     try:
#         value = next(generator)
#         print(value)
#     except Exception as e:
#         # 出现异常表示取值完成
#         break

# 提示：for循环内部自动捕获了停止迭代异常，也就是说推荐大家使用for循环取值，更加简单和方便
for value in generator:
    print(value)

print("----------------------")

# 2. 生成器创建的第二种方式，也就是在def函数内使用yield

def my_generator():
    for i in range(3):
        # 当启动生成器执行到yield的时候代码会暂停，然后把结果返回给外界
        # 当生成器再次启动的时候会在暂停的位置继续往下执行
        print("开始生成数据啦")
        yield i
        print("上一次数据生成完了")

generator = my_generator()
print(generator)

# 获取生成器当中的下一个值
# value = next(generator)
# print(value)
#
# value = next(generator)
# print(value)
#
# value = next(generator)
# print(value)

for num in generator:
    print(num)